package org.personal.jdbc;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;

public class PreparedStatement{

	private Connection connection=null;
	
	/** 构造方法
	 * @param connection
	 */
	public PreparedStatement(Connection connection){
		this.connection=connection;
	}
	
	/** 执行 UPDATE 和 DELETE SQL语句，返回影响行数
	 * @param sql SQL语句
	 * @param param 对应SQL语句?号的个数的参数集合
	 * @return 影响行数
	 */
	public int update(String sql,Object...param){
		int result=0;
		Connection con=null;
		java.sql.PreparedStatement pstat=null;
		try {
			con = getConnection();
			pstat = con.prepareStatement(sql);
			setPrepareStatementParam(pstat,param);
			result = pstat.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(pstat!=null)pstat.close();
				if(con!=null)con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return result;
	}
	

	/** 执行SQL查询语句,返回第一行第一列的结果对象
	 * @param sql SQL语句
	 * @param param 对应SQL语句?号的个数的参数集合
	 * @return 结果对象
	 */
	public Object query(String sql,Object...param){
		Object result=null;
		Connection con=null;
		java.sql.PreparedStatement pstat=null;
		ResultSet rs=null;
		try {
			con = getConnection();
			pstat=con.prepareStatement(sql);
			setPrepareStatementParam(pstat,param);
			rs=pstat.executeQuery();
			if(rs.next()){
				result=rs.getObject(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(rs!=null)rs.close();
				if(pstat!=null)pstat.close();
				if(con!=null)con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return result;
	}
	

	/** 执行SQL语句,获得javax.servlet.jsp.jstl.sql.Result结果集对象
	 * @param sql SQL语句
	 * @param param 对应SQL语句?号的个数的参数集合
	 * @return javax.servlet.jsp.jstl.sql.Result结果集对象
	 */
	public Result getResult(String sql,Object...param){
		Connection con=null;
		java.sql.PreparedStatement pstat=null;
		ResultSet rs=null;
		Result r=null;
		try {
			con = getConnection();
			pstat=con.prepareStatement(sql);
			setPrepareStatementParam(pstat,param);
			rs=pstat.executeQuery();
			r=ResultSupport.toResult(rs);
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(rs!=null)rs.close();
				if(pstat!=null)pstat.close();
				if(con!=null)con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return r;
	}
	
	/**参数处理
	 * @param pstat
	 * @param param
	 * @throws SQLException
	 */
	private void setPrepareStatementParam(java.sql.PreparedStatement pstat,Object...param) throws SQLException{
		if(param.length!=0){
			for (int i = 0; i < param.length; i++) {
				pstat.setObject(i+1,param[i]);
			}
		}
	}
	
	/** 获得数据库连接
	 * @return  java.sql.Connection
	 */
	public Connection getConnection() {
		return connection;
	}
	
	/**更改数据库连接对象
	 * @param connection 数据库连接对象
	 */
	public void setConnection(Connection connection){
		this.connection=connection;
	}
}
